export default ({ store, route, redirect, $axios }) => {
  //请求拦截器
  $axios.onRequest(config => {
    console.log("请求拦截器");
    //请求头加上token
    const accessToken = store.state.accessToken;
    //判断有没有token
    if (accessToken) {
      //有token的话就给请求头里加上token
      config.headers.Authorization = "Bearer " + accessToken;
    }
    return config;
  });
  //响应拦截器
  $axios.onResponse(res => {
    // console.log("响应拦截器", res);
    return res;
  });

  $axios.onError(err => {
    //非401未认证，放行报错
    if (err.response.status !== 401) {
      return Promise.reject(err);
    }
    console.log("响应异常", error.response.status);
    //是401  发送刷新令牌的请求
    sendRefreshRequest(store, route, redirect);
    return Promise.reject("令牌过期,重新登录");
  });
};

//锁，防止并发重复请求， true还未请求，false正在请求刷新
let isLock = true;
const sendRefreshRequest = (store, route, redirect) => {
  if (isLock && store.state.refreshToken) {
    //有刷新令牌的话，得防止一下重复请求刷新
    isLock = false;
    //通过刷新令牌获取新令牌
    redirect(
      `${process.env.authURL}/refresh?redirectURL=${redirectURL(route)}`
    );
  } else {
    isLock = true;

    isLock = true;
    // 没有刷新令牌，跳转到登录页
    // 注意不要使用 store.dispatch('LoginPage') ，因为 LoginPage 里面使用了window对象，nuxt服务端是没有此对象的，
    store.commit("RESET_USER_STATE");
    // 服务端帮我们跳转到登录页
    redirect(`${process.env.authURL}?redirectURL=${redirectURL(route)}`);
  }
};
const redirectURL = route => {
  // 客户端才有window
  if (process.client) {
    return window.location.href;
  }
  // 服务端 process.env._AXIOS_BASE_URL_
  // http://localhost:3000/api http://blog.mengxuegu.com/api
  return process.env._AXIOS_BASE_URL_.replace("api", "") + route.path;
};
